package com.cskaoyan.javase.oop1._12static._0introduction._1new;

/**
 * static关键字的引入
 * 引例：
 * 创建一个学生类，用来描述我们班全体同学，要求：
 * 		属性：姓名，性别，年龄，学号，学校信息
 * 		行为：吃饭，学习
 *
 * 所以说一千道一万
 * "学校信息"这个属性不应该定义为"成员变量"
 * 而应该考虑定义一种"全新的，属于类的"变量。
 * 实际上，属于类的变量在Java当中是存在的
 * 即使用static关键字修饰的，Java当中的静态成员变量。
 *
 * 静态成员变量：
 * 是一种被全体对象共享，属于类的变量，存储在一片能够被全体对象所共享的内存区域。
 * 而不像成员变量一样，存储在对象当中！！
 *
 * 静态成员变量的语法:
 * 简单来说,就是static修饰成员变量
 * [访问权限修饰符] static 数据类型 变量名;
 * 注:
 * 静态成员变量的数据类型可以是基本数据类型,也可以是引用数据类型
 *
 * 静态成员变量的使用特点:
 * 1.和成员变量一样,具有默认初始化,具有默认值!
 *      默认值和成员变量也是一样的.
 *
 * 2.和成员变量一样,也可以进行显式赋值,并且默认初始化是最先进行的,显式赋值会覆盖默认初始化的默认值.
 *
 * 3.静态成员变量是属于全体对象所共享的,不是属于某个对象的,所以禁止使用对象的引用去访问静态成员变量
 * 而是使用:
 * "类名."访问
 * 体现它是属于类的,是一种类的特征,而不是对象特征.
 *
 * 4.静态成员变量的使用和对象没有任何关系
 * 即便不创建对象,也能够使用静态成员变量
 * 静态成员变量不依赖于对象而存在.
 *
 *
 * static修饰的成员方法,称之为静态成员方法
 * 语法:
 * [访问权限修饰符] static 返回值类型 方法名(形参列表){
 *     // 方法体
 * }
 * 实际上我们之前使用的"public static"修饰的方法,都是静态成员方法
 *
 * 静态成员方法的使用特点:
 * 1.不依赖于对象,可以直接使用"类名."调用它
 * 2.禁止使用"对象名."调用
 * 3.在同类中时,访问静态成员方法,可以把类名省略,但是跨类不行.
 *
 * 为什么被static修饰的成员,称之为"静态成员",不依赖于对象,而是可以直接"类名."访问呢?
 *
 *
 * @since 09:31
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 创建王道Java42th的童鞋对象
        /*WangDaoStudent s1 = new WangDaoStudent("张三", "男", 18, 1);
        WangDaoStudent s2 = new WangDaoStudent("李四", "女", 28, 2);*/

        // Static member 'com.cskaoyan.javase.oop1._12static._0introduction._1new.WangDaoStudent.schoolName' accessed via instance reference
        /*System.out.println(s1.schoolName);
        s1.schoolName = "某友商训练营";
        System.out.println(s2.schoolName);*/

        System.out.println(WangDaoStudent.schoolName);
        WangDaoStudent.schoolName = "Java42th";
        System.out.println(WangDaoStudent.schoolName);

        WangDaoStudent.test();

        test();

    }

    public static void test(){}
}

class WangDaoStudent {
    String name;
    /*
        性别这种具有二元性的属性,很多程序员喜欢使用
        布尔类型的isMale或者isFemale来表示性别
        实际开发中不建议使用这种写法
        建议使用String类型的一个gender,sex
     */
    String gender;
    int age;
    int stuId;
    /*
        学校信息属于全体对象共享 属于类
        就定义为静态成员变量
     */
    static String schoolName = "王道训练营";

    // 构造器

    public WangDaoStudent() {
    }

    public WangDaoStudent(String name, String gender, int age, int stuId) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.stuId = stuId;
    }

    public void eat() {
        System.out.println("十点开始就想,今天中午吃什么呢?");
    }

    public void study() {
        System.out.println("学习使我快乐!");
    }

    // 定义静态成员方法
    public static void test(){
        System.out.println("这是一个测试方法!");
    }

}